/*
 HTML/CSS 是标记语言
 Linux/Windows 是操作系统
 MySQL、SQL Server、Oracle、mongodb 是数据库
 --------
 “面向对象「OOP」”是一种编程思想
   + javascript：vue.js、jquery.js、react.js、node.js...
   + java
   + python
   + C#(ASP.NET)
   + C++
   + PHP
   + ...
 “面向过程 POP”
   + C
 --------
 编程语言之母：C语言 「学习面向过程编程思想」
 编程语言之父：JAVA语言 「学习面向对象编程思想」

 ====================
 面向对象编程思想是一套非常“伟大”的编程思想
   + 对象：泛指，万物皆对象，JS中所有事物都是我们需要学习研究及使用的“对象”
   + 类：对“对象”的细分，为了更好的学习JS，我们这些内容按照功能特征，划分成为大类和小类
   + 实例：某一类别中具体的事物称之为实例
 每个实例都是单独的个体，具备自己独有的属性(特征)；
 但是实例也具备类所赋予的一些公共的属性(特征)；
 --->同一类的多个实例，既具备独立的属性，也具备公共的属性！！

 ====================
 JS本身就是基于面向对象思想构建的编程语言
   JS中包含很多内置类(天生自带的类)
   @1 每一种数据类型都有自己所属的内置类
   @2 每一个DOM元素也有自己所属的内置类
   ......

 ====================
 学习面向对象编程思想的作用：
   + 有助于我们学习JS：我们后期再研究某个东西，按照面向对象的思想去学习
   + 平时写业务逻辑的时候，我们不会基于类和实例的方式去写，只有在封装的时候「封装插件、组件、框架」的时候，我们才会基于面向对象的思想去封装！！！
   + ...
 */

/* // 构造函数（类）设计模式：构建一个类，并且创造它的实例
const Fn = function Fn(x, y) {
    let sum = 10;
    this.total = x + y;
    this.say = function () {
        console.log(`我计算的和是:${this.total}`);
    };
};
let res = Fn(10, 20); //普通函数执行
let f1 = new Fn(10, 20); //构造函数执行  Fn被称为“构造函数(类)”，返回的f1是当前类的实例
let f2 = new Fn;
console.log(f1.sum);
console.log(f1.total);
console.log(f1.say === f2.say); */


function Fn() {
    this.x = 100;
    this.y = 200;
    this.getX = function () {
        console.log(this.x);
    }
}
Fn.prototype.getX = function () {
    console.log(this.x);
};
Fn.prototype.getY = function () {
    console.log(this.y);
};
let f1 = new Fn;
let f2 = new Fn;
console.log(f1.getX === f2.getX);
console.log(f1.getY === f2.getY);
console.log(f1.__proto__.getY === Fn.prototype.getY);
console.log(f1.__proto__.getX === f2.getX);
console.log(f1.getX === Fn.prototype.getX);
console.log(f1.constructor);
console.log(Fn.prototype.__proto__.constructor);
f1.getX();
f1.__proto__.getX();
f2.getY();
Fn.prototype.getY();